package top.lyjwn.todo.weinxin.data.mch.param;

import top.lyjwn.todo.common.utils.XMLUtil;

/**
 * 交易保保障
 * 
 * 商户在调用微信支付提供的相关接口时， 会得到微信支付返回的相关信息以及获得整个接口的响应时间。
 * 
 * 为提高整体的服务水平，协助商户一起提高服务质量，微信支付提供了相关接口调用耗时和返回信息的主动上报接口，
 * 
 * 微信支付可以根据商户侧上报的数据进一步优化网络部署，完善服务监控，和商户更好的协作为用户提供更好的业务体验。
 * 
 * @author luoyujie
 *
 */

public class Report implements XmlFormat {

	private String appid;

	private String mch_id;

	/**
	 * 非必填
	 * 
	 * 设备号
	 * 
	 * 微信支付分配的终端设备号，商户自定义
	 */
	private String device_info;

	/**
	 * 必填
	 * 
	 * 随机字符串
	 * 
	 * 随机字符串，不长于32位。推荐随机数生成算法
	 */
	private String nonce_str;

	/**
	 * 必填
	 * 
	 * 签名
	 * 
	 * 签名，详见签名生成算法
	 */
	private String sign;

	/**
	 * 非必填
	 * 
	 * 签名类型
	 * 
	 * 签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
	 */
	private String sign_type;
	/**
	 * 必填
	 * 
	 * 接口URL
	 * 
	 * 报对应的接口的完整URL，类似：
	 * 
	 * https://api.mch.weixin.qq.com/pay/unifiedorder
	 * 
	 * 对于刷卡支付，为更好的和商户共同分析一次业务行为的整体耗时情况，对于两种接入模式，请都在门店侧对一次刷卡支付进行一次单独的整体上报，上报URL指定为：
	 * 
	 * https://api.mch.weixin.qq.com/pay/micropay/total
	 * 
	 * 关于两种接入模式具体可参考本文档章节：刷卡支付商户接入模式
	 * 
	 * 其它接口调用仍然按照调用一次，上报一次来进行。
	 * 
	 */
	private String interface_url;
	/**
	 * 必填
	 * 
	 * 接口耗时
	 * 
	 * 接口耗时情况，单位为毫秒
	 */
	private String execute_time;
	/**
	 * 必填
	 * 
	 * 返回状态码
	 * 
	 * SUCCESS/FAIL
	 * 
	 * 此字段是通信标识，非交易标识，交易是否成功需要查看trade_state来判断
	 * 
	 */
	private String return_code;
	/**
	 * 必填
	 * 
	 * 返回信息
	 * 
	 * 当return_code为FAIL时返回信息为错误原因 ，例如
	 * 
	 * 签名失败
	 * 
	 * 参数格式校验错误
	 * 
	 */
	private String return_msg;
	/**
	 * 必填
	 * 
	 * 业务结果
	 * 
	 * SUCCESS/FAIL
	 */
	private String result_code;
	/**
	 * 非必填
	 * 
	 * 错误代码
	 * 
	 * ORDERNOTEXIST—订单不存在
	 * 
	 * SYSTEMERROR—系统错误
	 * 
	 */
	private String err_code;
	/**
	 * 非必填
	 * 
	 * 错误代码描述
	 * 
	 * ORDERNOTEXIST—订单不存在
	 * 
	 * SYSTEMERROR—系统错误
	 * 
	 */
	private String err_code_des;
	/**
	 * 非必填
	 * 
	 * 商户订单号
	 * 
	 * 商户系统内部的订单号,商户可以在上报时提供相关商户订单号方便微信支付更好的提高服务质量。
	 */
	private String out_trade_no;
	/**
	 * 必填
	 * 
	 * 访问接口IP
	 * 
	 * 发起接口调用时的机器IP
	 */
	private String user_ip;

	/**
	 * 非必填
	 * 
	 * 商户上报时间
	 * 
	 * 系统时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
	 */
	private String time;

	public Report(String appid,String mch_id,String nonce_str,  String interface_url, String execute_time, String return_code,
			String return_msg, String result_code, String user_ip, String time) {
		this.appid =appid;
		this.mch_id =mch_id;
		this.nonce_str = nonce_str;
		this.interface_url = interface_url;
		this.execute_time = execute_time;
		this.return_code = return_code;
		this.return_msg = return_msg;
		this.result_code = result_code;
		this.user_ip = user_ip;
		this.time = time;
	}

	public Report() {
	}

	public void setSign(String sign) {
		this.sign = sign;
	}


	public String getSign_type() {
		return sign_type;
	}

	public String getErr_code() {
		return err_code;
	}

	public String getErr_code_des() {
		return err_code_des;
	}

	public String getOut_trade_no() {
		return out_trade_no;
	}

	public String getTime() {
		return time;
	}

	public String getAppid() {
		return appid;
	}

	public String getMch_id() {
		return mch_id;
	}

	public String getDevice_info() {
		return device_info;
	}

	public String getNonce_str() {
		return nonce_str;
	}

	public String getSign() {
		return sign;
	}

	public String getInterface_url() {
		return interface_url;
	}

	public String getExecute_time() {
		return execute_time;
	}

	public String getReturn_code() {
		return return_code;
	}

	public String getReturn_msg() {
		return return_msg;
	}

	public String getResult_code() {
		return result_code;
	}

	public String getUser_ip() {
		return user_ip;
	}

	@Override
	public String toXml() {
		return XMLUtil.convertToXml(this);
	}

}
